import {getByTypes} from "_p/basic/api/admin/datadic";

// 校验是否最多两位小数
export function isTwoDicmal(value) {
    var reg = /^(([1-9]\d*)|0)(\.\d{1,2})?$/;
    return reg.test(value);
}

// 英文或数字，英文数字
export function isLetterNum(value) {
    var reg = /^[a-zA-Z0-9]+$/;
    return reg.test(value);
}

// 英文或数字，英文数字
export function isInteger(value) {
    var reg = /^[0-9]+$/;
    return reg.test(value);
}

// 校验最多三位小数
export function isThreeDicmal(value) {
    var reg = /^(([1-9]\d*)|0)(\.\d{1,3})?$/;
    return reg.test(value);
}

export function keepTwoDicmal(value) {
    var reg = /^-?\d+\.?\d{0,2}$/;
    return reg.test(value);
}

export function isDicmal(value) {
    var reg = /[1-9]?[0-9]*\.[0-9]*$/;
    return reg.test(value);
}

export function isPhone(value) {
    var reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
    return reg.test(value);
}

export function isLinePhone(value) {
    var reg = /^0\d{2,3}-?\d{7,8}$/;
    return reg.test(value);
}

export function isPlateNo(value) {
    var reg = /^(?=.*[A-Za-z])(?=.*[\u4e00-\u9fa5])(?=.*\d)[A-Za-z\u4e00-\u9fa5\d]{7,}$/
    return reg.test(value);
}

// 数字与英文
export function isPlateCharNum(value) {
    var reg = /^(?=.*[A-Z])(?=.*\d)[A-Z\d\.\\\/\-]+$/
    return reg.test(value)

}

// 数字与英文
export function isCharNum(value) {
    var reg = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]+$/
    return reg.test(value)

}

// 数字或英文与数字
export function isMoreCharNum(value) {
    var reg = /^(?=.*\d)[A-Za-z\d]+$/
    return reg.test(value)
}

export function nameCheck(value) {
    var reg = /(^[\u4e00-\u9fa5]{1}[\u4e00-\u9fa5\.·。]{0,8}[\u4e00-\u9fa5]{1}$)|(^[a-zA-Z]{1}[a-zA-Z\s]{0,8}[a-zA-Z]{1}$)/;
    return reg.test(value);
}

/**
 * 姓名校验，包含生僻字
 * @author 耿继辉
 * @param value
 * @returns {*|boolean}
 */
// var reg = /^((?![\u3000-\u303F])[\u2E80-\uFE4F]|\·)*(?![\u3000-\u303F])[\u2E80-\uFE4F](\·)*$|(^[a-zA-Z]{1}[a-zA-Z\s]{0,8}[a-zA-Z]{1}$)/;
export function nameCheckTow(value) {
    var reg = /^[a-zA-Z]|[\u4e00-\u9fa5]|[a-zA-Z]$/;
    return reg.test(value);
}

export function certNocheck(value) {
    var reg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i;
    return reg.test(value)
}

/**
 * 字符串必须为正整数校验
 * @author 耿继辉
 * @param value
 * @returns {*|boolean}
 */
export function isPositiveString(value) {
    var reg = /^[1-9]\d*$/;
    return reg.test(value)
}

/**
 * 专为工作年限做的校验,支持最小为零,最多一位小数
 * @param value
 * @returns {*|boolean}
 */
export function isPositiveStringForWorkAge(value) {
    var reg = /^(([1-9]\d*)|0)(\.\d{1})?$/;
    return reg.test(value)
}


/**
 * 座机及手机号校验
 * @author 耿继辉
 * @param value
 * @returns {*|boolean}
 */
export function phoneAndFixedLinePhoneCheck(value) {
    var reg = /^((0\d{2,3}(-?)\d{7,8})|(1[3456789]\d{9}))$/;
    return reg.test(value)

}

/**
 * 字符串必须为正整数校验
 * @author 耿继辉
 * @param rule
 * @param value
 * @param callback
 */
export function isCheckItOut(rule, value, callback) {
    if (value) {
        if (!isPositiveString(value) && value !== '') {
            callback(new Error("请输入正确的工作年限"))
        } else {
            callback()
        }
    } else {
        callback()
    }

}

/**
 * @author 耿继辉
 * 手机及固定电话格式校验
 * @param rule
 * @param value
 * @param callback
 */
export function isCheckPhoneAndFixedLinePhone(rule, value, callback) {
    if (value) {
        if (!phoneAndFixedLinePhoneCheck(value) && value !== '') {
            callback(new Error("请输入正确的电话或固话号码"))
        } else {
            callback()
        }
    } else {
        callback()
    }

}

/**
 *
 * 专为工作年限做的校验,支持最小为零
 * @author 耿继辉
 * @param rule
 * @param value
 * @param callback
 */
export function isCheckItOutForWorkAge(rule, value, callback) {
    if (value) {
        if (!isPositiveStringForWorkAge(value) && value !== '') {
            callback(new Error("请输入正确的工作年限"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}


/**
 *
 * @param value
 */
export function moneyCheck(value) {
    var reg = /(^[1-9](0-9)+)?(\.[0-9]{1,2})|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;
    return reg.test(value)
}

//金额校验
export function isMoneyValue(rule, value, callback) {
    if (value) {
        if (!isTwoDicmal(value) && value !== '') {
            callback(new Error("请输入正确金额"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

// 数据字典 value转title
export function setDataDictVal(d, v) {
    let data = d.filter(item => item.value == v);
    if (data[0] && data[0].title) {
        return data[0].title;
    } else {
        return "";
    }
}


export function isTwoDicmalValiate(rule, value, callback) {
    if (value) {
        if (!isTwoDicmal(value)) {
            callback(new Error("最多为两位小数"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

export function isIntegerValiate(rule, value, callback) {
    if (value) {
        if (!isInteger(value)) {
            callback(new Error("格式为整数"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

//身份证号校验
export function doValidID(rule, value, callback) {
    if (value) {
        if (!certNocheck(value)) {
            callback(new Error('身份证号码不正确'));
        } else {
            callback();
        }
    } else {
        callback();
    }
}

// 电话与手机号校验
export function isMorePhoneValiate(rule, value, callback) {
    if (value) {
        if (!isPhone(value) && !isLinePhone(value)) {
            callback(new Error("手机/电话格式不正确"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

//手机号校验
export function isPhoneValiate(rule, value, callback) {
    if (value) {
        if (!isPhone(value)) {
            callback(new Error("手机格式不正确"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

export function isCharNumValitate(rule, value, callback) {
    if (value) {
        if (!isPlateCharNum(value)) {
            callback(new Error("格式为英文与数字或英文与数字与字符(\\ / . -)"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

export function isMoreCharNumValitate(rule, value, callback) {
    if (value) {
        if (!isMoreCharNum(value)) {
            callback(new Error("格式为数字或英文与数字"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

/**
 * 姓名校验-包含生僻字
 * @author 耿继辉
 * @param rule
 * @param value
 * @param callback
 */
export function isNameValiate(rule, value, callback) {
    if (value) {
        if (!nameCheckTow(value)) {
            callback(new Error("请输入正确的姓名"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

export function getDictDataList(arr) {
    return new Promise((resolve, reject) => {
        var data = {},
            queryArr = new Set();
        Array.isArray(arr) && arr.forEach(ele => {
            queryArr.add(ele)
        })
        if (queryArr.size > 0) {
            getByTypes([...queryArr]).then(res => {
                if (res.code === "0000" && res.data) {
                    Object.keys(res.data).forEach(ele => {
                        data[ele + 'Dict'] = res.data[ele];
                    })
                } else {
                    console.error('获取数据字典出错:', [...queryArr])
                }
                resolve(data);
            });
        } else {
            resolve(data);
        }
    });
}

// 是否为正整数
export function isPositiveInteger(value) {//是否为正整数
    var reg = /^[0-9]+[0-9]*[0-9]*$/;
    return reg.test(value)
}

// 数组去重
export function unique(arr) {
    return Array.from(new Set(arr))
}

// 两数向加
export function add(arg1, arg2) {
    var r1, r2, m;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    return (multiply(arg1, m) + multiply(arg2, m)) / m;
}

export function sub(arg1, arg2) {
    var r1, r2, m;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    return (multiply(arg1, m) - multiply(arg2, m)) / m;
}

//两数相乘
export function multiply(num1, num2) {
    var m = 0, s1 = num1.toString(), s2 = num2.toString();
    try {
        m += s1.split(".")[1].length
    } catch (e) {
    }
    ;
    try {
        m += s2.split(".")[1].length
    } catch (e) {
    }
    ;
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

// 两数相除
export function divided(num1, num2) {
    var t1, t2, r1, r2;
    try {
        t1 = num1.toString().split('.')[1].length;
    } catch (e) {
        t1 = 0;
    }
    try {
        t2 = num2.toString().split(".")[1].length;
    } catch (e) {
        t2 = 0;
    }
    r1 = Number(num1.toString().replace(".", ""));
    r2 = Number(num2.toString().replace(".", ""));
    return (r1 / r2) * Math.pow(10, t2 - t1);
}

//银行卡校验
export function luhmCheck(bankno) {
    let lastNum = bankno.substr(bankno.length - 1, 1) // 取出最后一位（与luhm进行比较）
    let first15Num = bankno.substr(0, bankno.length - 1) // 前15或18位
    let newArr = []
    for (let i = first15Num.length - 1; i > -1; i--) { // 前15或18位倒序存进数组
        newArr.push(first15Num.substr(i, 1))
    }
    let arrJiShu = [] // 奇数位*2的积 < 9
    let arrJiShu2 = [] // 奇数位*2的积 >9

    let arrOuShu = [] // 偶数位数组
    for (let j = 0; j < newArr.length; j++) {
        if ((j + 1) % 2 === 1) { // 奇数位
            if (parseInt(newArr[j]) * 2 < 9) {
                arrJiShu.push(parseInt(newArr[j]) * 2)
            } else {
                arrJiShu2.push(parseInt(newArr[j]) * 2)
            }
        } else {
            arrOuShu.push(newArr[j])
        }// 偶数位
    }
    let jishuChild1 = [] // 奇数位*2 >9 的分割之后的数组个位数
    let jishuChild2 = [] // 奇数位*2 >9 的分割之后的数组十位数
    for (let h = 0; h < arrJiShu2.length; h++) {
        jishuChild1.push(parseInt(arrJiShu2[h]) % 10)
        jishuChild2.push(parseInt(arrJiShu2[h]) / 10)
    }
    let sumJiShu = 0 // 奇数位*2 < 9 的数组之和
    let sumOuShu = 0 // 偶数位数组之和
    let sumJiShuChild1 = 0 // 奇数位*2 >9 的分割之后的数组个位数之和
    let sumJiShuChild2 = 0 // 奇数位*2 >9 的分割之后的数组十位数之和
    let sumTotal = 0
    for (let m = 0; m < arrJiShu.length; m++) {
        sumJiShu = sumJiShu + parseInt(arrJiShu[m])
    }
    for (let n = 0; n < arrOuShu.length; n++) {
        sumOuShu = sumOuShu + parseInt(arrOuShu[n])
    }
    for (let p = 0; p < jishuChild1.length; p++) {
        sumJiShuChild1 = sumJiShuChild1 + parseInt(jishuChild1[p])
        sumJiShuChild2 = sumJiShuChild2 + parseInt(jishuChild2[p])
    }
    // 计算总和
    sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2)
    // 计算Luhm值
    let k = parseInt(sumTotal) % 10 === 0 ? 10 : parseInt(sumTotal) % 10
    let luhm = 10 - k
    if (Number(lastNum) === luhm && lastNum.length !== 0 && bankno.length > 11) {
        return true
    } else {
        return false
    }
}

export function isBankNoValiate(rule, value, callback) {
    if (value) {
        if (!luhmCheck(value)) {
            callback(new Error("请输入正确的银行卡号"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}

export function isPositiveInt(rule, value, callback) {
    if (value) {
        if (!isPositiveInteger(value)) {
            callback(new Error("请输入正确的金额"))
        } else {
            callback()
        }
    } else {
        callback()
    }
}
